# 封装的 CMake 函数，检查头文件是否存在，并定义宏
function(my_check_header_exists_and_define_macro HEADER_NAME)
    # 检查传入的额外参数的数量
    if(ARGN)
        list(LENGTH ARGN ARGN_COUNT)
        if(ARGN_COUNT GREATER 1)
            message(FATAL_ERROR "Only one optional argument (custom macro) is allowed, but ${ARGN_COUNT} were provided.")
        endif()
        set(CUSTOM_MACRO ${ARGN})
    else()
        set(CUSTOM_MACRO "")
    endif()

    include(CheckIncludeFiles)
    
    # 检查头文件是否存在
    check_include_files("${HEADER_NAME}" HEADER_FOUND)

    if(HEADER_FOUND)
        message(STATUS "Found header: ${HEADER_NAME}")
        
        # 如果用户提供了自定义宏，则使用自定义宏
        if(CUSTOM_MACRO)
            set(MACRO_NAME ${CUSTOM_MACRO})
        else()
            # 如果没有提供自定义宏，则根据头文件生成宏
            # 将文件名转换为大写，并替换字符
            string(TOUPPER ${HEADER_NAME} HEADER_NAME_UPPER)
            string(REPLACE "." "_" HEADER_NAME_UPPER ${HEADER_NAME_UPPER})
            string(REPLACE "/" "_" HEADER_NAME_UPPER ${HEADER_NAME_UPPER})  # 将 '/' 转换为 '_'
            set(MACRO_NAME "HAVE_${HEADER_NAME_UPPER}")
        endif()

        # 定义宏，供后续编译使用
        add_definitions(-D"${MACRO_NAME}")
    else()
        message(WARNING "Header not found: ${HEADER_NAME}")
    endif()
endfunction()

# 调用示例
#check_header_exists_and_define_macro("sys/types.h")  # 使用默认宏
#check_header_exists_and_define_macro("sys/types.h" "MY_CUSTOM_MACRO")  # 使用自定义宏
# 如果传入多个额外参数，会导致错误：
# check_header_exists_and_define_macro("sys/types.h" "MY_CUSTOM_MACRO" "ANOTHER_MACRO")

# 检查函数是否存在并定义宏
macro(my_check_function_exists_and_define_macro function_name macro_name)
    # 使用 check_function_exists 检查函数是否存在
    include(CheckFunctionExists)
    check_function_exists(${function_name} FUNCTION_EXISTS)

    if(FUNCTION_EXISTS)
        # 如果函数存在，定义宏
        message(STATUS "Function ${function_name} exists. Defining macro ${macro_name}")
        add_definitions(-D${macro_name})
    else()
        message(WARNING "Function ${function_name} does not exist.")
    endif()
endmacro()
